home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 32 / Mac Magazin and MacEasy Magazine CD - Issue 32.iso / Multimedia / MIDI / MidiChaos_15 Folder / MidiChaos_1.5 / Source / Chaotic_critter next >
Text File  |  1995-04-28  |  4KB  |  198 lines

  1. \ This class will generate integer output from chaotic equations.
  2. \ Author: Darren Gibbs  Copyright 1990
  3. \ Date: 4/24/90
  4. \
  5. \ MOD: RDG 5/22/90  Restructured for polyphony.
  6. \ MOD: RDG 10/1/90  Added new equations; Added FP ivars, made into object! 
  7.  
  8. ANEW TASK-CHAOTIC_CRITTER
  9.  
  10. 3.1415926536  FCONSTANT PI
  11.  
  12. 4 CONSTANT #FUNCTIONS
  13.   0 CONSTANT TRIG
  14.   1 CONSTANT KAC
  15.   2 CONSTANT LOGISTICS
  16.   3 CONSTANT INSECT
  17.  
  18. \ Define the functions.
  19. : TRIG.FUNC  ( -- )  ( p1 p2 x -- x' )
  20. \ x' = p1 sin(pi * x)
  21. \ 0 < x < 1 ; 0 < p1 < 1
  22.     FSWAP FDROP  \ don't need p2
  23.     PI F*  FSIN  F*
  24. ;    
  25.     
  26. : KAC.FUNC  ( -- )  ( p1 p2 x -- x' )   
  27. \ x' = p1 x      for x < .50
  28. \ x' = p1(1 - x) for x > .50
  29. \ 0 < x < 1 ; 1 < p1 < 2
  30.     FSWAP FDROP  \ don't need p2
  31.     FDUP .50 F<
  32.     IF F* 
  33.     ELSE 1.00  FSWAP  F-  F*   
  34.     THEN 
  35. ;
  36.  
  37. : LOGISTICS.FUNC  (  -- )  ( p1 p2 x -- x' )   
  38. \ x' = p1 x (1 - x)
  39. \ 0 < x < 1 ;  0 < p1 < 4
  40.     FSWAP FDROP    \ don't need p2
  41.     FDUP 1.00  FSWAP  F- F* F* 
  42. ;
  43.  
  44. : INSECT.FUNC  ( -- )  ( p1 p2 x -- x' )   
  45. \ x' = p1 x (1 + x)  EXP -p2
  46. \ 0 < x < 1 ; 1 < p2 < 10 ; 1 < p1 < 1000
  47.     FDUP 1.00  F+     
  48.     FROT         ( p1 x x+1 p2 -- )
  49.     FNEGATE  F**
  50.     F* F*
  51. ;
  52.  
  53. CREATE FUNCTION-LIST  
  54.     'c trig.func a, 'c kac.func a,  
  55.     'c logistics.func a,  'c insect.func a,
  56.                       
  57. : INDEX>CFA  ( index -- CFA , get CFA from index. )    
  58.     function-list  swap  cell* +  a@
  59. ;
  60.  
  61. TEXTROM FUNCTION-NAMES  ," Trig" ," Kac" ," Logistics" ," Insect" 
  62.  
  63. : GET.FUNCTION.NAME  ( index -- text )  ( -- )
  64.     function-names 
  65. ;
  66.  
  67. : GET.#FUNCTIONS  ( -- n )  ( -- )
  68.     #functions
  69. ;
  70.  
  71. : GET.FUNCTION.MIN/MAX  ( index -- p1min p1max p2min p2max )  ( -- )
  72.     CASE
  73.         TRIG         OF   1   99  0      ENDOF \ flags will disable fader
  74.         KAC         OF   1  199  0      ENDOF
  75.         LOGISTICS     OF 101  399  0      ENDOF
  76.         INSECT         OF 101 9999  0 999  ENDOF
  77.     ENDCASE
  78. ;
  79. : GET.FUNCTION.NOMINAL  ( index -- p1-nom p2-nom )  ( -- )
  80.     CASE
  81.         TRIG         OF  70 0  ENDOF
  82.         KAC         OF  80 1  ENDOF
  83.         LOGISTICS     OF 200 1  ENDOF
  84.         INSECT         OF 500 50 ENDOF
  85.     ENDCASE
  86. ;
  87.  
  88. \ -------------------------------------------------------------------------------
  89. \ Begin class definition
  90. \ -------------------------------------------------------------------------------
  91.  
  92. METHOD PUT.P1:           METHOD GET.P1:
  93. METHOD PUT.P2:          METHOD GET.P2:
  94. METHOD PUT.X:              METHOD GET.X:
  95. METHOD GET.FUNCTION:    METHOD USE.FUNCTION:
  96. METHOD EXEC.FP:
  97.  
  98. :CLASS OB.CHAOTIC_CRITTER <SUPER OBJECT
  99.  
  100.     IV.FLPT IV-P1
  101.     IV.FLPT IV-P2
  102.     IV.FLPT IV-X
  103.     IV.LONG    IV-CURRENT-FUNCTION
  104.  
  105.     OB.FP_LINEAR_SCALER IO-SCALING
  106.  
  107. :M PUT.P1:  ( r -- )  ( -- )
  108.     i>f 100.0 f/   iv=> iv-p1
  109. ;M
  110.  
  111. :M GET.P1:  ( -- p )  ( -- )
  112.     iv-p1 100.0 f* f>i   
  113. ;M
  114.  
  115. :M PUT.P2:  ( b -- )  ( -- )
  116.     i>f 100.0 f/   iv=> iv-p2
  117. ;M
  118.  
  119. :M GET.P2:  ( -- b )  ( -- )
  120.     iv-p2 100.0 f* f>i   
  121. ;M
  122.  
  123. :M PUT.X:  ( x -- )  ( -- )
  124.     i>f 100.0 f/   iv=> iv-x
  125. ;M
  126.  
  127. :M GET.X:  ( -- x )  ( -- )
  128.     iv-x 100.0 f* f>i   
  129. ;M
  130.  
  131. :M PUT.MIN:  ( min -- )  ( -- )
  132.     i>f  put.ylow: io-scaling
  133. ;M
  134.  
  135. :M PUT.MAX:  ( max -- )  ( -- )
  136.     i>f  put.yhi: io-scaling
  137. ;M
  138.  
  139. :M GET.MIN:  ( -- )  ( -- min )
  140.     get.ylow: io-scaling f>i
  141. ;M
  142.  
  143. :M GET.MAX:  ( -- )  ( -- max )
  144.     get.yhi: io-scaling f>i
  145. ;M
  146.  
  147. :M EXEC:  ( -- x )  ( -- )
  148.     iv-p1 iv-p2 iv-x
  149.     iv-current-function execute   
  150.     fdup iv=> iv-x
  151.     scale>int: io-scaling 
  152. ;M
  153.  
  154. :M EXEC.FP:  ( -- )  ( -- x )
  155.     iv-p1 iv-p2 iv-x
  156.     iv-current-function execute   
  157.     fdup iv=> iv-x
  158. ;M
  159.  
  160. :M USE.FUNCTION:  ( index -- )  ( -- )
  161.     dup  get.function.nominal  ( index p1-nom p2-nom -- )
  162.     put.p2: self   \ set params to reasonable values
  163.     put.p1: self 
  164.     50 put.x: self  
  165.     index>cfa  iv=> iv-current-function
  166. ;M
  167.  
  168. :M GET.FUNCTION:  ( -- index )  ( -- )
  169.     #functions 0  DO
  170.         I index>cfa  iv-current-function  =
  171.         IF I leave
  172.         THEN
  173.     LOOP
  174. ;M
  175.  
  176. :M PRINT:  ( -- )  ( -- )
  177.     cr name: self cr
  178.     ." Function: "   get.function: self  get.function.name  type cr
  179.     ."  P1: " get.p1: self  . cr
  180.     ."  P2: " get.p2: self  . cr
  181.     ."  X:  " get.x:  self  . cr
  182.     ."  Min Output: " get.min: self . cr
  183.     ."  Max Output: " get.max: self . cr
  184. ;M    
  185.     
  186. :M INIT:  ( -- )
  187.     init: super
  188.     trig index>cfa iv=> iv-current-function
  189.     70 put.p1: self
  190.     0 put.p2: self
  191.     80 put.x:  self
  192.     0.0 1.0 0.0 127.0  stuff:  io-scaling
  193. ;M 
  194.  
  195. ;CLASS
  196.  
  197.